package com.xu.springboot04.controller;

import com.xu.springboot04.bean.Blog;
import com.xu.springboot04.bean.User;
import com.xu.springboot04.service.BlogService;
import com.xu.springboot04.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpSession;

/**
 * 错误处理
 *
 * 1.默认规则
 *
 * 1.1 默认情况下，Spring Boot 提供 /error 处理所有错误的映射
 * 1.2 对于机器客户端，它将生成 JSON 响应，其中包含错误，HTTP 状态和异常消息的详细信息，对于浏览器客户端，响应一个 "whitelabel"
 *     错误视图，以 HTML 格式呈现相同的数据
 * 1.3 要对其进行自定义，添加 View 解析为 error
 * 1.4 要完全替换默认行为，可以实现 ErrorController 并且注册该类型的 Bean 定义，或者添加 ErrorAttributes 类型的组件以使用现有机制
 *     替换其内容
 *
 * 2.定制错误处理逻辑
 *
 * 2.1 自定义错误页：error/404.html、error/5XX.html
 * 2.2 @ControllerAdvice + @ExceptionHandler 处理异常
 * 2.3 实现 HandlerExceptionResolver 处理异常
 *
 */

@Controller
public class IndexController {

    @Autowired
    public JdbcTemplate jdbcTemplate;

    @Autowired
    public BlogService blogService;

    @ResponseBody
    @GetMapping("/blog")
    public Blog getBlogById(@RequestParam("id") String id){
        return blogService.getBlogById(id);
    }

    @ResponseBody
    @GetMapping("/sql")
    public String queryFromDB(){
        Long along = jdbcTemplate.queryForObject("select count(*) from mybatis.blog", Long.class);
        return along.toString();
    }

    /**
     * 跳转到 login.html 页面
     */
    @GetMapping(value = {"/", "/login"})
    public String loginPage(){
        return "login";
    }

    @PostMapping("/login")
    public String main(User user, HttpSession session, Model model){
        if (StringUtils.hasLength(user.getUsername()) && "123456".equals(user.getPassword())){
            // 把登录成功的用户保存起来
            session.setAttribute("loginUser", user);
            // 登录成功之后重定向到 main.html，这里重定向可以防止表单重复提交
            return "redirect:/main.html";
        }else {
            model.addAttribute("msg", "账号密码错误");
            // 回到登录页面
            return "login";
        }
    }

    /**
     * 跳转到 main.html 页面
     */
    @GetMapping("/main.html")
    public String mainPage(Model model, HttpSession session){
        // 是否登录，拦截器，过滤器
        return "main";
    }

}
